package com.dmy.ui;

import com.dmy.config.GameConfig;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ListIterator;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * 子弹类
 */
public class Bullet {

    private int x; // 子弹坐标x
    private int y; // 子弹坐标y
    private Color color; // 子弹颜色
    private int direction; // 方向： 1 为上 ，-1 为下 ，2 为左 -2 为右
    private Tank tank; // 子弹属于哪个坦克
    private java.util.List<Bullet> bulletList = new java.util.LinkedList<Bullet>(); // 待发射的子弹列表 ，

    private MyJPanel myJPanel;
    public Bullet() {
    }

    public Bullet(Color color, int x, int y, int direction,Tank tank) {
        this.color = color;
        this.x = x;
        this.y = y;
        this.direction = direction;
        this.tank = tank;
    }

    // 绘图后置调用
    public void afterInvoke(Graphics2D g) {
        if (bulletList.size() == 0) {
            return;
        }
        // 使用迭代器遍历 可以边遍历边删除
        ListIterator<Bullet> iterator = bulletList.listIterator();
        while (iterator.hasNext()) {
            Bullet b = iterator.next();
            // 判断子弹超出屏幕 消失
            if (b.x < 0 || b.x > GameConfig.WINDOW_WIDTH) {
                iterator.remove();
            }
            // 子弹超出屏幕消失
            if (b.y < 0 || b.y > GameConfig.WINDOW_HEIGHT) {
                iterator.remove();
            }

            g.setColor(b.color);
            // 更新子弹方向和坐标
            updateBulletXY(b);
            // 画子弹
            g.fillArc(b.x, b.y, 7, 7, 0, 360);
            // 检查坦克被击中 减少生命和消失
            if(checkHit(b,myJPanel)){
                iterator.remove();
            }
        }
    }

    private boolean checkHit(Bullet b, MyJPanel myJPanel) {

      try {

          // 判断当前子弹是不是敌人打出来的
          // 如果不是敌人打出来的 则是自己打出
          if(!b.tank.isEnemyTank()){
              // 获取敌军坦克的列表信息
              java.util.List<Tank> tankList = myJPanel.getEnyTanks();
              ListIterator<Tank> iterator = tankList.listIterator();
              while (iterator.hasNext()){
                  Tank t = iterator.next();
                  // 循环判断子弹是否 打在了敌军任意一个敌人身上
                  if(b.x>=t.getX()&&b.x<=t.getX()+46&&b.y>=t.getY()&&b.y<=t.getY()+60){
                      // 打中敌人 判断敌人生命是否大于1 如果大于生命减少1 否则直接从地图上删除
                        if(t.getLifeNum()>1){
                            // 如果打中敌人 敌人的生命减少1
                            t.over();
                        }else{
                            iterator.remove();
                            // 获取得分 如果敌人是泰坦 +10分 否则+1分
                            if(t.getName().equals("钛")){
                                ((MyTank) b.tank).incrAttack10();
                            }else {
                                ((MyTank) b.tank).incrAttackNum();
                            }
                        }
                      return true;
                  }
              }
          }else{
              // 否则当前子弹是敌人打出来的
              // 获取玩家坦克列表
              java.util.List<Tank> myTanks = myJPanel.getMyTanks();
              ListIterator<Tank> tankListIterator = myTanks.listIterator();
              while (tankListIterator.hasNext()){
                  MyTank t =(MyTank) tankListIterator.next();
                  // 判断敌军坦克是否击中了自己
                  if(b.x>=t.getX()&&b.x<=t.getX()+46&&b.y>=t.getY()&&b.y<=t.getY()+65){
                      // 如果击中 玩家坦克生命减少
                      t.over();
                      // 并且从地图删除
                      tankListIterator.remove();

                      // 如果玩家生命大于0 则闪烁 重生
                      if(t.getLifeNum()>0){
                          // 启动一个线程去完成闪烁特效
                          CompletableFuture.runAsync(()->{
                              try {
                                  Thread.sleep(500);
                              } catch (InterruptedException e) {
                                  e.printStackTrace();
                              }
                              for (int i = 0;i<3;i++){
                                  myTanks.add(t);
                                  try {
                                      Thread.sleep(500);
                                  } catch (InterruptedException e) {
                                      e.printStackTrace();
                                  }
                                  myTanks.remove(t);
                                  try {
                                      Thread.sleep(500);
                                  } catch (InterruptedException e) {
                                      e.printStackTrace();
                                  }
                              }
                              myTanks.add(t);
                          });
                      }

                      return true;
                  }
              }
          }
      }catch (Exception e){
          e.printStackTrace();
      }
      return false;
    }

    /**
     * 更细子弹坐标
     * @param b
     */
    private void updateBulletXY(Bullet b) {
        switch (b.direction) {
            case 1:
                b.y -= 10;
                break;
            case -1:
                b.y += 10;
                break;
            case 2:
                b.x -= 10;
                break;
            case -2:
                b.x += 10;
                break;
        }
    }

    // 生产子弹
    public void attack(JComponent jComponent, Color color, int x, int y, int direction,Tank tank) {
        if(myJPanel==null)
            myJPanel = (MyJPanel)jComponent;
        if (bulletList.size() >= 3)
            return;
        bulletList.add(new Bullet(color, x, y, direction,tank));
        new Timer(70, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (bulletList.size() == 0) {
                    Thread.currentThread().stop();
                }
                jComponent.repaint();
            }
        }).start();
    }
}
